﻿package projects {
	import extremefx.events.EventArgs;	
	import extremefx.ui.ButtonSprite;	
	import extremefx.browser.FlashVars;
	import extremefx.drawing.SlicedBitmap;
	import extremefx.geom.Size;
	import extremefx.modules.DeepZoom;
	import extremefx.ui.BitmapButton;
	
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.external.ExternalInterface;
	import flash.geom.Point;
	import flash.geom.Rectangle;	

	/**
	 * @author Marcelo Volmaro
	 */
	 
	[Frame(factoryClass="extremefx.Preloader")];
	public final class GlearchMap extends Sprite {
		private var _ds:DeepZoom;

		private var _foreground:SlicedBitmap;
		private var _cCodes:Array;
		private var _cNames:Array;
		private var _overl:Object;
		private var _buttons:Sprite;

		public function main():void{
			FlashVars.init(this);
			
			_cCodes = [];
			_cNames = [];
			_ds = new DeepZoom(this, 0xbee8fe);
			_ds.loadXml(FlashVars.getValue("mapUrl", "worldmap.xml"), _map);

						
			_ds.position = new Point(6, 6);
			
			var countries:Array = [ { code: "AF", name: "Afghanistan" }, { code: "AX", name: "Åland Islands" }, { code: "AL", name: "Albania" }, { code: "DZ", name: "Algeria" }, { code: "AS", name: "American Samoa" }, { code: "AD", name: "Andorra" }, { code: "AO", name: "Angola" }, { code: "AI", name: "Anguilla" }, { code: "AQ", name: "Antarctica" }, { code: "AG", name: "Antigua and Barbuda" }, { code: "AR", name: "Argentina" }, { code: "AM", name: "Armenia" }, { code: "AW", name: "Aruba" }, { code: "AU", name: "Australia" }, { code: "AT", name: "Austria" }, { code: "AZ", name: "Azerbaijan" }, { code: "BS", name: "Bahamas" }, { code: "BH", name: "Bahrain" }, { code: "BD", name: "Bangladesh" }, { code: "BB", name: "Barbados" }, { code: "BY", name: "Belarus" }, { code: "BE", name: "Belgium" }, { code: "BZ", name: "Belize" }, { code: "BJ", name: "Benin" }, { code: "BM", name: "Bermuda" }, { code: "BT", name: "Bhutan" }, { code: "BO", name: "Bolivia" }, { code: "BA", name: "Bosnia and Herzegovina" }, { code: "BW", name: "Botswana" }, { code: "BV", name: "Bouvet Island" }, { code: "BR", name: "Brazil" }, { code: "IO", name: "British Indian Ocean Territory" }, { code: "BN", name: "Brunei Darussalam" }, { code: "BG", name: "Bulgaria" }, { code: "BF", name: "Burkina Faso" }, { code: "BI", name: "Burundi" }, { code: "KH", name: "Cambodia" }, { code: "CM", name: "Cameroon" }, { code: "CA", name: "Canada" }, { code: "CV", name: "Cape Verde" }, { code: "KY", name: "Cayman Islands" }, { code: "CF", name: "Central African Republic" }, { code: "TD", name: "Chad" }, { code: "CL", name: "Chile" }, { code: "CN", name: "China" }, { code: "CX", name: "Christmas Island" }, { code: "CC", name: "Cocos (Keeling) Islands" }, { code: "CO", name: "Colombia" }, { code: "KM", name: "Comoros" }, { code: "CG", name: "Congo" }, { code: "CD", name: "Congo, The Democratic Republic of the" }, { code: "CK", name: "Cook Islands" }, { code: "CR", name: "Costa Rica" }, { code: "CI", name: "Côte d'Ivoire" }, { code: "HR", name: "Croatia" }, { code: "CU", name: "Cuba" }, { code: "CY", name: "Cyprus" }, { code: "CZ", name: "Czech Republic" }, { code: "DK", name: "Denmark" }, { code: "DJ", name: "Djibouti" }, { code: "DM", name: "Dominica" }, { code: "DO", name: "Dominican Republic" }, { code: "EC", name: "Ecuador" }, { code: "EG", name: "Egypt" }, { code: "SV", name: "El Salvador" }, { code: "GQ", name: "Equatorial Guinea" }, { code: "ER", name: "Eritrea" }, { code: "EE", name: "Estonia" }, { code: "ET", name: "Ethiopia" }, { code: "FK", name: "Falkland Islands (Malvinas)" }, { code: "FO", name: "Faroe Islands" }, { code: "FJ", name: "Fiji" }, { code: "FI", name: "Finland" }, { code: "FR", name: "France" }, { code: "GF", name: "French Guiana" }, { code: "PF", name: "French Polynesia" }, { code: "TF", name: "French Southern Territories" }, { code: "GA", name: "Gabon" }, { code: "GM", name: "Gambia" }, { code: "GE", name: "Georgia" }, { code: "DE", name: "Germany" }, { code: "GH", name: "Ghana" }, { code: "GI", name: "Gibraltar" }, { code: "GR", name: "Greece" }, { code: "GL", name: "Greenland" }, { code: "GD", name: "Grenada" }, { code: "GP", name: "Guadeloupe" }, { code: "GU", name: "Guam" }, { code: "GT", name: "Guatemala" }, { code: "GG", name: "Guernsey" }, { code: "GN", name: "Guinea" }, { code: "GW", name: "Guinea-Bissau" }, { code: "GY", name: "Guyana" }, { code: "HT", name: "Haiti" }, { code: "HM", name: "Heard Island and McDonald Islands" }, { code: "VA", name: "Holy See (Vatican City State)" }, { code: "HN", name: "Honduras" }, { code: "HK", name: "Hong Kong" }, { code: "HU", name: "Hungary" }, { code: "IS", name: "Iceland" }, { code: "IN", name: "India" }, { code: "ID", name: "Indonesia" }, { code: "IR", name: "Iran, Islamic Republic of" }, { code: "IQ", name: "Iraq" }, { code: "IE", name: "Ireland" }, { code: "IM", name: "Isle of Man" }, { code: "IL", name: "Israel" }, { code: "IT", name: "Italy" }, { code: "JM", name: "Jamaica" }, { code: "JP", name: "Japan" }, { code: "JE", name: "Jersey" }, { code: "JO", name: "Jordan" }, { code: "KZ", name: "Kazakhstan" }, { code: "KE", name: "Kenya" }, { code: "KI", name: "Kiribati" }, { code: "KP", name: "Korea, Democratic People's Republic of" }, { code: "KR", name: "Korea, Republic of" }, { code: "KW", name: "Kuwait" }, { code: "KG", name: "Kyrgyzstan" }, { code: "LA", name: "Lao People's Democratic Republic" }, { code: "LV", name: "Latvia" }, { code: "LB", name: "Lebanon" }, { code: "LS", name: "Lesotho" }, { code: "LR", name: "Liberia" }, { code: "LY", name: "Libyan Arab Jamahiriya" }, { code: "LI", name: "Liechtenstein" }, { code: "LT", name: "Lithuania" }, { code: "LU", name: "Luxembourg" }, { code: "MO", name: "Macao" }, { code: "MK", name: "Macedonia, The Former Yugoslav Republic of" }, { code: "MG", name: "Madagascar" }, { code: "MW", name: "Malawi" }, { code: "MY", name: "Malaysia" }, { code: "MV", name: "Maldives" }, { code: "ML", name: "Mali" }, { code: "MT", name: "Malta" }, { code: "MH", name: "Marshall Islands" }, { code: "MQ", name: "Martinique" }, { code: "MR", name: "Mauritania" }, { code: "MU", name: "Mauritius" }, { code: "YT", name: "Mayotte" }, { code: "MX", name: "Mexico" }, { code: "FM", name: "Micronesia, Federated States of" }, { code: "MD", name: "Moldova" }, { code: "MC", name: "Monaco" }, { code: "MN", name: "Mongolia" }, { code: "ME", name: "Montenegro" }, { code: "MS", name: "Montserrat" }, { code: "MA", name: "Morocco" }, { code: "MZ", name: "Mozambique" }, { code: "MM", name: "Myanmar" }, { code: "NA", name: "Namibia" }, { code: "NR", name: "Nauru" }, { code: "NP", name: "Nepal" }, { code: "NL", name: "Netherlands" }, { code: "AN", name: "Netherlands Antilles" }, { code: "NC", name: "New Caledonia" }, { code: "NZ", name: "New Zealand" }, { code: "NI", name: "Nicaragua" }, { code: "NE", name: "Niger" }, { code: "NG", name: "Nigeria" }, { code: "NU", name: "Niue" }, { code: "NF", name: "Norfolk Island" }, { code: "MP", name: "Northern Mariana Islands" }, { code: "NO", name: "Norway" }, { code: "OM", name: "Oman" }, { code: "PK", name: "Pakistan" }, { code: "PW", name: "Palau" }, { code: "PS", name: "Palestinian Territory, Occupied" }, { code: "PA", name: "Panama" }, { code: "PG", name: "Papua New Guinea" }, { code: "PY", name: "Paraguay" }, { code: "PE", name: "Peru" }, { code: "PH", name: "Philippines" }, { code: "PN", name: "Pitcairn" }, { code: "PL", name: "Poland" }, { code: "PT", name: "Portugal" }, { code: "PR", name: "Puerto Rico" }, { code: "QA", name: "Qatar" }, { code: "RE", name: "Réunion" }, { code: "RO", name: "Romania" }, { code: "RU", name: "Russian Federation" }, { code: "RW", name: "Rwanda" }, { code: "BL", name: "Saint Barthélemy" }, { code: "SH", name: "Saint Helena" }, { code: "KN", name: "Saint Kitts and Nevis" }, { code: "LC", name: "Saint Lucia" }, { code: "MF", name: "Saint Martin" }, { code: "PM", name: "Saint Pierre and Miquelon" }, { code: "VC", name: "Saint Vincent and the Grenadines" }, { code: "WS", name: "Samoa" }, { code: "SM", name: "San Marino" }, { code: "ST", name: "Sao Tome and Principe" }, { code: "SA", name: "Saudi Arabia" }, { code: "SN", name: "Senegal" }, { code: "RS", name: "Serbia" }, { code: "SC", name: "Seychelles" }, { code: "SL", name: "Sierra Leone" }, { code: "SG", name: "Singapore" }, { code: "SK", name: "Slovakia" }, { code: "SI", name: "Slovenia" }, { code: "SB", name: "Solomon Islands" }, { code: "SO", name: "Somalia" }, { code: "ZA", name: "South Africa" }, { code: "GS", name: "South Georgia and the South Sandwich Islands" }, { code: "ES", name: "Spain" }, { code: "LK", name: "Sri Lanka" }, { code: "SD", name: "Sudan" }, { code: "SR", name: "Suriname" }, { code: "SJ", name: "Svalbard and Jan Mayen" }, { code: "SZ", name: "Swaziland" }, { code: "SE", name: "Sweden" }, { code: "CH", name: "Switzerland" }, { code: "SY", name: "Syrian Arab Republic" }, { code: "TW", name: "Taiwan, Province of China" }, { code: "TJ", name: "Tajikistan" }, { code: "TZ", name: "Tanzania, United Republic of" }, { code: "TH", name: "Thailand" }, { code: "TL", name: "Timor-Leste" }, { code: "TG", name: "Togo" }, { code: "TK", name: "Tokelau" }, { code: "TO", name: "Tonga" }, { code: "TT", name: "Trinidad and Tobago" }, { code: "TN", name: "Tunisia" }, { code: "TR", name: "Turkey" }, { code: "TM", name: "Turkmenistan" }, { code: "TC", name: "Turks and Caicos Islands" }, { code: "TV", name: "Tuvalu" }, { code: "UG", name: "Uganda" }, { code: "UA", name: "Ukraine" }, { code: "AE", name: "United Arab Emirates" }, { code: "GB", name: "United Kingdom" }, { code: "US", name: "United States" }, { code: "UM", name: "United States Minor Outlying Islands" }, { code: "UY", name: "Uruguay" }, { code: "UZ", name: "Uzbekistan" }, { code: "VU", name: "Vanuatu" }, { code: "VE", name: "Venezuela" }, { code: "VN", name: "Viet Nam" }, { code: "VG", name: "Virgin Islands, British" }, { code: "VI", name: "Virgin Islands, U.S." }, { code: "WF", name: "Wallis and Futuna" }, { code: "EH", name: "Western Sahara" }, { code: "YE", name: "Yemen" }, { code: "ZM", name: "Zambia" }, { code: "ZW", name: "Zimbabwe" } ];
			var countryObj:Object, index:Number;
			
			index = 0;
			while (countryObj = countries[index]) {
				_cCodes[index] = countryObj.code;
				_cNames[index] = countryObj.name;
				index++;
			}
			
			var map:Sprite = new WorldMap() as Sprite;
			var mapBounds:Rectangle = map.getBounds(map);
			var xAdjust:Number = 26.5;
			var width:Number = mapBounds.width + xAdjust;
			var height:Number = mapBounds.height;
			var h:Number = height / width;
			
			_overl = {};
			
			for (var i:Number = 0; i < _cCodes.length; i++) {
				var name:String = "mc_"+_cCodes[i].toLowerCase();
				if (!(name in map)) {
					trace("Country not found: " + _cCodes[i] + " : " + _cNames[i]);
					continue;
				}
				
				var country:Sprite = map[name];
				var mcBounds:Rectangle = country.getBounds(map);
				
				var rx:Number = (mcBounds.x + xAdjust) / width;
				var ry:Number = (mcBounds.y / height) * h;
				var rw:Number = mcBounds.width / width;
				var rh:Number = (mcBounds.height / height) * h;
				
				if ((rx + rw) > width) rw = width - rx;  
				if ((ry + rh) > height) rh = height - ry;
				
				_overl[name] = new MapAsset(country, _onClick); 
				
				_ds.addOverlay(
					_overl[name], 
					new Rectangle(rx, ry, rw, rh)
				);
			}			
			
			_foreground = new SlicedBitmap(
				new MapForegroung(493, 247),
				false,
				false,
				new Rectangle(12, 12, 468, 222)
			);
			
			addChild(_foreground);
			
			_buttons = new Sprite();
			addChild(_buttons);
			
			var zoomIn:BitmapButton = new BitmapButton(Vector.<BitmapData>([
				new zoomInNormal(35,34),
				new zoomInHover(35,34),
			]));
			
			_buttons.addChild(zoomIn.view);
			zoomIn.button.onRelease.add(function(pSender:ButtonSprite, pArgs:EventArgs):void{
				_ds.zoomBy(2);
			});
			
			var zoomOut:BitmapButton = new BitmapButton(Vector.<BitmapData>([
				new zoomOutNormal(35,34),
				new zoomOutHover(35,34),
			]));
			
			_buttons.addChild(zoomOut.view);
			zoomOut.view.x = 35;
			zoomOut.button.onRelease.add(function(pSender:ButtonSprite, pArgs:EventArgs):void{
				_ds.zoomBy(0.5);
			});
			
			var goHome:BitmapButton = new BitmapButton(Vector.<BitmapData>([
				new homeNormal(35,34),
				new homeHover(35,34),
			]));
			
			_buttons.addChild(goHome.view);
			goHome.view.x = 70;
			goHome.button.onRelease.add(function(pSender:ButtonSprite, pArgs:EventArgs):void{
				_ds.goHome();
			});
			
			if (ExternalInterface.available){
				ExternalInterface.addCallback("focusCountry", _focusCountry);
			}
			
			this.stage.addEventListener(Event.RESIZE, _resize);
			_resize();
			_ds.zoomTo(1);
		}

		private function _onClick(pCountry:String):void {
			if (ExternalInterface.available) {
				ExternalInterface.call(_js.toString(), FlashVars.getValue("selectID"), pCountry.toUpperCase().substr(3));
			}
		}

		private function _focusCountry(pCountry:String):void {
//			_ds.fitBounds(_bounds["mc_"+pCountry]);

			pCountry = "mc_" + pCountry.toLowerCase();
			if ((pCountry in _overl)) {
				(_overl[pCountry] as MapAsset).select();
					
			} else {
				MapAsset.unselect();
			}
		}

		private function _resize(event:Event = null):void {
			var w:uint = this.stage.stageWidth;
			var h:uint = this.stage.stageHeight;
			_buttons.x = w - 116;
			_buttons.y = h - 40;
			
			_foreground.setSize(w, h);
			_ds.size = new Size(w - 12, h - 12);
		}
		
		private var _map:XML = <Image TileSize="256" Overlap="1" Format="jpg" xmlns="http://schemas.microsoft.com/deepzoom/2008"><Size Width="13924" Height="8290" /></Image>;
		

		private var _js:XML = <script><![CDATA[
			function _efx_setSelected(pElementId, pValue){
				var s = document.getElementById(pElementId),
				i = 0, o, f = false;
				while (o = s.options[i++]){
					if (o.value === pValue){
						s.selectedIndex = i - 1;
						f = true;
						break;
					}
				}
				
				if (f) s.onchange();
			}
			
		]]></script>;
	}
}

import extremefx.anim.Tween;

import flash.display.Sprite;
import flash.events.MouseEvent;

class MapAsset extends Sprite {
	private static var _lastSelected:MapAsset;
	
	private var _tween:Tween;
	private var _hasHandlers:Boolean;
	private var _clickHandler:Function;
	private var _name:String;

	public function MapAsset(pMapSymbol:Sprite, pClickHandler:Function) {
		_name = pMapSymbol.name;
		
		addChild(pMapSymbol);
		pMapSymbol.x = pMapSymbol.y = alpha = 0;
		_clickHandler = pClickHandler;
		
//		var newColorTransform:ColorTransform = transform.colorTransform;
//		newColorTransform.color = 0x336699;
//		transform.colorTransform = newColorTransform;
		_tween = new Tween(this, 0.3);
	}
	
	private function _out(event:MouseEvent):void {
		if (_lastSelected == this) return;
		
		_tween.setProperty("alpha", 0);
	}

	private function _over(event:MouseEvent):void {
		if (_lastSelected == this) return;
		
		_tween.setProperty("alpha", .5);
	}
	
	public static function unselect():void {
		if (_lastSelected){
			_lastSelected._tween.setProperty("alpha", 0);
			_lastSelected = null;
		}	
	}
	
	public function select():void {
		unselect();
		_lastSelected = this;
		_tween.setProperty("alpha", .5);
	}

	private function _checkVisibility():void{
		this.visible = !((width < 8 || height < 8) || (width > 384 || height > 384));
		
		if (visible) {
			if (!_hasHandlers){
				_hasHandlers = true;
				this.addEventListener(MouseEvent.MOUSE_OVER, _over, false, 0, true);
				this.addEventListener(MouseEvent.MOUSE_OUT, _out, false, 0, true);
				this.addEventListener(MouseEvent.MOUSE_DOWN, _click, false, 0, true);
			}
		} else {
			if (_hasHandlers){
				_hasHandlers = false;
				this.removeEventListener(MouseEvent.MOUSE_OVER, _over);
				this.removeEventListener(MouseEvent.MOUSE_OUT, _out);
				this.removeEventListener(MouseEvent.MOUSE_DOWN, _click);
			}
		}
	}
	
	private function _click(event:MouseEvent):void {
		event.stopPropagation();
		select();
		_clickHandler(_name);
	}

	override public function set width(pWidth:Number):void {
		super.width = pWidth;
		_checkVisibility();
	}
	
	override public function set height(pHeight:Number):void {
		super.height = pHeight;
		_checkVisibility();
	}
}
